package com.itqf.service.impl;

import com.itqf.dao.GoodsDao;
import com.itqf.dao.impl.GoodsDaoImpl;
import com.itqf.pojo.Goods;
import com.itqf.service.GoodsService;
import com.itqf.utils.StrUtils;
import com.itqf.vo.PageBean;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * projectName: gpshop
 *
 * @author: 赵伟风
 * time: 2021/7/22 16:16
 * description:
 */
public class GoodsServiceImpl implements GoodsService {


    /**
     * 分页查询业务
     *
     * @param parameterMap
     * @return
     */
    @Override
    public PageBean<Goods> findPage(Map<String, String[]> parameterMap) throws SQLException {

        //1.判断pageSize
        //默认第一页
        int page = 1;
        //默认的每页显示数量
        int pageSize =2;

        if (parameterMap.containsKey("page") && !StrUtils.isEmpty(parameterMap.get("page")[0]))
        {
            //读取传入的页数
            page = Integer.parseInt(parameterMap.get("page")[0]);
        }

        if (parameterMap.containsKey("pageSize") && !StrUtils.isEmpty(parameterMap.get("pageSize")[0]))
        {
            //读取传入的页数
            pageSize = Integer.parseInt(parameterMap.get("pageSize")[0]);
        }

        //2.动态拼接sql语句!
        String base = "select g_id gId,g_name gName,g_price gPrice,g_img gImg,g_rank gRank,g_date gDate,g_detail gDetail " +
                "from goods where 1=1 ";

        String countBase = "select count(1) from goods where 1 = 1 ";

        /**
         * cId 和 key 是互斥的!
         *
         * 不是互斥,也可以都存在,都不存在!
         *
         * 注意:  动态sql语句! 互斥,直接判断追加where条件即可! 并且只会有一个占位符的值!
         *                   非互斥, 不能直接判断追加where条件!原因可能没有或者多个条件! 在where添加一个 1=1
         *                          确保where存在的正确性!后面每个条件都追加and 拼接即可!
         *                          并且,占位符不能用单一值!要使用一个集合容器,添加占位符的值!
         */
        //占位符的sql
        StringBuilder indexBuilder = new StringBuilder();
        //查询数据的sql
        StringBuilder sqlBuilder = new StringBuilder(base);
        //查询总条数的sql
        StringBuilder countBuilder = new StringBuilder(countBase);

        PageBean<Goods> pageBean = new PageBean<>();

        if (parameterMap.containsKey("cId") && !StrUtils.isEmpty(parameterMap.get("cId")[0]))
        {
            //读取传入类别的id
            sqlBuilder.append(" and c_id = ? ");
            countBuilder.append(" and c_id = ? ");
            indexBuilder.append(parameterMap.get("cId")[0]);
            pageBean.setcId(parameterMap.get("cId")[0]);

        }


        if (parameterMap.containsKey("key") && !StrUtils.isEmpty(parameterMap.get("key")[0]))
        {
            //读取传入类别的id
            sqlBuilder.append(" and g_name like ? ");
            countBuilder.append(" and g_name like ? ");
            indexBuilder.append("%").append(parameterMap.get("key")[0]).append("%");
            pageBean.setKey(parameterMap.get("key")[0]);
            /**
             * 线程安全: 并发场景[多线程场景] 多线程拥有同一个资源的使用句柄!
             */

            //StringBuilder:线程非安全的!内部维护的动态字符数组!字符串拼接和字符串裁剪都不会产生临时对象! jdk1.5版本以后!
                            //默认长度是16 如果设置默认字符串,默认长度为:字符串长度+16!
            //StringBuffer: 线程安全的!内部维护的动态字符数组!字符串拼接和字符串裁剪都不会产生临时对象!

            //如果使用的jdk版本高于1.8[不包含1.8],字符串拼接会自动转化成StringBuilder.append();
        }

        sqlBuilder.append(" limit ? ,? ;");

        //3.数据库查询
        GoodsDao goodsDao = new GoodsDaoImpl();
        //分页数据
        List<Goods> goodsList =  goodsDao.queryByPage(sqlBuilder.toString(),indexBuilder.toString(),page,pageSize);
        //分页的总条数
        Long total = goodsDao.queryTotal(countBuilder.toString(),indexBuilder.toString());

        /**
         * PageBean需要提前装载cid或者key!所以提前初始化对象!
         * 后面需要调用set方法进行赋值!
         */
        pageBean.setPage(page);
        pageBean.setPageSize(pageSize);
        pageBean.setList(goodsList);
        pageBean.setTotal(total);

        return  pageBean;
    }

    /**
     * 根据商品id查询商品实体
     *
     * @param gId
     * @return
     */
    @Override
    public Goods findDetail(String gId) throws SQLException {
        //直接查询商品
        GoodsDao goodsDao = new GoodsDaoImpl();

        Goods goods = goodsDao.queryGoods(gId);

        return goods;
    }
}
